﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Linq;
using System.Data.SqlClient;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Transactions;
using BS_Gimnasio.General;
using DS_Gimnasio;

namespace BS_Gimnasio.Logistica
{
    [DataContract()]
    public class cls_Producto : cls_Base
    {
        #region Variables

        private int _idProducto;
        private string _codigoProducto;
        private string _nombreProducto;
        private string _descripcion;
        private int _idProveedor;
        private decimal _cantidadActual;
        private decimal _precioCompra;
        private decimal _precioVenta;
        private decimal _impuesto;
        private bool _decimales;
        private decimal _ganacia;
        private decimal _porcentajeUtilidad;
        private int _minimo;
        private int _maximo;
        private int _idGimnasio;
        private int _idTipoProducto;
        private int _idEstado;

        #endregion

        #region Propiedades

        [DataMember]
        public int IdProducto
        {
            get { return _idProducto; }
            set { _idProducto = value; }
        }

        [DataMember]
        public string CodigoProducto
        {
            get { return _codigoProducto; }
            set { _codigoProducto = value; }
        }

        [DataMember]
        public string NombreProducto
        {
            get { return _nombreProducto; }
            set { _nombreProducto = value; }
        }

        [DataMember]
        public string Descripcion
        {
            get { return _descripcion; }
            set { _descripcion = value; }
        }

        [DataMember]
        public int IdProveedor
        {
            get { return _idProveedor; }
            set { _idProveedor = value; }
        }

        [DataMember]
        public decimal CantidadActual
        {
            get { return _cantidadActual; }
            set { _cantidadActual = value; }
        }

        [DataMember]
        public decimal PrecioCompra
        {
            get { return _precioCompra; }
            set { _precioCompra = value; }
        }

        [DataMember]
        public decimal PrecioVenta
        {
            get { return _precioVenta; }
            set { _precioVenta = value; }
        }

        [DataMember]
        public decimal Impuesto
        {
            get { return _impuesto; }
            set { _impuesto = value; }
        }

        [DataMember]
        public bool Decimales
        {
            get { return _decimales; }
            set { _decimales = value; }
        }

        [DataMember]
        public decimal Ganacia
        {
            get { return _ganacia; }
            set { _ganacia = value; }
        }

        [DataMember]
        public decimal PorcentajeUtilidad
        {
            get { return _porcentajeUtilidad; }
            set { _porcentajeUtilidad = value; }
        }

        [DataMember]
        public int Minimo
        {
            get { return _minimo; }
            set { _minimo = value; }
        }

        [DataMember]
        public int Maximo
        {
            get { return _maximo; }
            set { _maximo = value; }
        }

        [DataMember]
        public int IdGimnasio
        {
            get { return _idGimnasio; }
            set { _idGimnasio = value; }
        }

        [DataMember]
        public int IdTipoProducto
        {
            get { return _idTipoProducto; }
            set { _idTipoProducto = value; }
        }
        [DataMember]
        public int IdEstado
        {
            get { return _idEstado; }
            set { _idEstado = value; }
        }

        #endregion
        
        #region Metodos Heredados

        public override void InsertarActualizarRegistro(bool tipoOperacion, ref string mensajeError)
        {
            if (tipoOperacion)
            {
                InsertarRegistro(ref mensajeError);
            }

            else
            {
                ActualizarRegistro(ref mensajeError);
            }
        }

        private void InsertarRegistro(ref string mensajeError)
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        db.SP_Insertar_Producto(IdUsuarioInicioSeccion, CodigoProducto, NombreProducto, Descripcion, IdProveedor,
                            CantidadActual, PrecioCompra, PrecioVenta, Impuesto, Decimales, Ganacia,
                            PorcentajeUtilidad, Minimo, Maximo, IdGimnasio, IdTipoProducto,_idEstado,ref mensajeError);

                        transaction.Complete();
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        private void ActualizarRegistro(ref string mensajeError)
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        DataTable dt = new DataTable();

                        ISingleResult<SP_Actualizar_ProductoResult> resultado = db.SP_Actualizar_Producto(IdUsuarioInicioSeccion, IdProducto, CodigoProducto, NombreProducto, Descripcion, IdProveedor,
                            CantidadActual, PrecioCompra, PrecioVenta, Impuesto, Decimales, Ganacia,
                            PorcentajeUtilidad, Minimo, Maximo, IdGimnasio, IdTipoProducto,IdEstado, ref mensajeError);
                        
                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                        if (dt.Rows.Count != 0)
                        {
                            cls_Contro_Alertas _alerta = new cls_Contro_Alertas();
                            _alerta.IdUsuarioInicioSeccion = _idUsuarioInicioSeccion;//Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                            object result = new object();
                            _alerta.OtrosProcesos(1, ref result);
                            //MessageBox.Show("Tiene una nueva alerta en inventario", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }

                        transaction.Complete();

                        
                    
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        public override cls_Base TraerObjeto()
        {
            try
            {

                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    ISingleResult<SP_Seleccionar_Datos_ProductosResult> resultado = db.SP_Seleccionar_Datos_Productos(IdUsuarioInicioSeccion, IdProducto);
                    DataTable dt = cls_Adaptador.ToDataTable(resultado.ToList());

                    if (dt != null & dt.Rows.Count > 0)
                    {
                        DataRow fila = dt.Rows[0];
                        IdProducto = Convert.ToInt32(fila[0].ToString());
                        CodigoProducto = fila[1].ToString();
                        NombreProducto = fila[2].ToString();
                        Descripcion = fila[3].ToString();
                        IdProveedor = Convert.ToInt32(fila[4].ToString());
                        CantidadActual = Convert.ToDecimal(fila[5].ToString());
                        PrecioCompra = Convert.ToDecimal(fila[6].ToString());
                        PrecioVenta = Convert.ToDecimal(fila[7].ToString());
                        Impuesto = Convert.ToDecimal(fila[8].ToString());
                        Decimales = Convert.ToBoolean(fila[9].ToString());
                        Ganacia = Convert.ToDecimal(fila[10].ToString());
                        PorcentajeUtilidad = Convert.ToDecimal(fila[11].ToString());
                        Minimo = Convert.ToInt32(fila[12].ToString());
                        Maximo = Convert.ToInt32(fila[13].ToString());
                        IdGimnasio = Convert.ToInt32(fila[14].ToString());
                        IdTipoProducto = Convert.ToInt32(fila[15].ToString());
                        IdEstado = Convert.ToInt32(fila[16].ToString());
                    }

                    else
                    {
                        MensajeError = "Producto no existente";
                    }
                }

            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }

            return this;
        }


        public override bool EliminarRegistro(ref string mensajeError)
        {
            throw new NotImplementedException();
        }

        public override DataTable Listar(int opcion)
        {
            try
            {
                DataTable dt = new DataTable();

                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    if (opcion == 1)
                    {
                        ISingleResult<SP_Seleccionar_Todo_ProductosResult> resultado = db.SP_Seleccionar_Todo_Productos(IdUsuarioInicioSeccion);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                    }

                    else if (opcion == 2)
                    {
                        ISingleResult<SP_Seleccionar_Filtro_ProductosResult> resultado = db.SP_Seleccionar_Filtro_Productos(IdUsuarioInicioSeccion, Convert.ToInt32(Filtros[0]), Filtros[1]);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                    }

                    else
                        if (opcion == 3)
                        {
                            ISingleResult<SP_Seleccionar_Combo_ProductosResult> resultado = db.SP_Seleccionar_Combo_Productos(IdUsuarioInicioSeccion);

                            dt = cls_Adaptador.ToDataTable(resultado.ToList());
                        }
                        else
                            if (opcion == 4)
                            {

                                ISingleResult<SP_Seleccionar_Todo_Productos_ActivosResult> resultado = db.SP_Seleccionar_Todo_Productos_Activos(IdUsuarioInicioSeccion, _idProveedor);

                                dt = cls_Adaptador.ToDataTable(resultado.ToList());


                            }
                            else
                                if (opcion == 5)
                                {
                                    ISingleResult<SP_Seleccionar_Filtro_Productos_ActivosResult> resultado = db.SP_Seleccionar_Filtro_Productos_Activos(IdUsuarioInicioSeccion, Convert.ToInt32(Filtros[0]), Filtros[1], _idProveedor);

                                    dt = cls_Adaptador.ToDataTable(resultado.ToList());
                                }
                    return dt;
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                return null;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                return null;
            }
        }

        public override void OtrosProcesos(int opcion, ref object resultado)
        {
            switch (opcion)
            {
                case 1:
                    resultado = this.obtenerExistenciaArticulo(_idProducto);
                    break;
                default:
                    break;
            }
        }
        
        #endregion

        #region Metodos Propios
        public decimal obtenerExistenciaArticulo(int idProducto)
        {
            try
            {
                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    return (decimal)db.FN_Devolver_Saldo_Articulo(idProducto);
                }
            }
            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                return 1;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                return 1;
            }

        }

        #endregion

    }
}
